import json

from apps.ai.utils import logger


def analyze_subject_domain(self, note_content, note_title=None):
    """
    分析笔记内容和标题，确定其学科领域和主要知识点
    
    参数:
        note_content: 笔记内容
        note_title: 笔记标题
        
    返回:
        包含学科领域和主要知识点的字典
    """
    try:
        # 使用fine_tuning_service进行学科检测
        from .fine_tuning_service import fine_tuning_service
        subject_area = fine_tuning_service._detect_subject_area(note_content, note_title)
        
        # 使用AI提取关键知识点
        system_prompt = """你是一位专业的知识图谱分析专家，擅长从学术笔记中提取关键知识点和概念。请从提供的笔记中识别最重要的知识点（5-10个），这些知识点应代表笔记的核心内容。

对于每个知识点，请提供:
1. 知识点名称（简洁、准确的术语）
2. 重要性评分（1-10，10为最重要）
3. 与该领域的关联度（1-10，10为最高）
4. 该知识点在笔记中是否有详细解释（是/否）

只返回JSON格式的结果，不要有其他文字。格式如下:
{
  "subject_area": "识别的学科领域",
  "knowledge_points": [
    {
      "name": "知识点1",
      "importance": 8,
      "relevance": 9,
      "is_explained": true
    },
    ...
  ]
}"""

        user_prompt = f"请分析以下笔记，识别其学科领域和关键知识点:\n\n标题: {note_title or '无标题'}\n\n内容:\n{note_content[:3000]}..."
        
        # 调用AI服务
        from ..services.ai_service import ai_service
        ai_response = ai_service._call_api([
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ], temperature=0.3)
        
        # 解析JSON响应
        try:
            analysis_result = json.loads(ai_response)
            
            # 如果AI没有识别出学科领域，使用我们之前检测的结果
            if not analysis_result.get("subject_area") and subject_area:
                analysis_result["subject_area"] = subject_area
                
            return analysis_result
        except json.JSONDecodeError:
            # 如果无法解析JSON，返回基本分析结果
            logger.warning(f"无法解析AI响应的JSON: {ai_response[:100]}...")
            return {
                "subject_area": subject_area or "未知",
                "knowledge_points": []
            }
            
    except Exception as e:
        logger.error(f"分析学科领域失败: {str(e)}")
        return {
            "subject_area": "未知",
            "knowledge_points": []
        }

def generate_concept_connections(self, knowledge_points, subject_area=None):
    """
    生成知识点之间的连接关系
    
    参数:
        knowledge_points: 知识点列表
        subject_area: 学科领域
        
    返回:
        包含连接关系的字典
    """
    if not knowledge_points or len(knowledge_points) < 2:
        return {"connections": []}
        
    # 提取知识点名称
    point_names = [p.get("name", p) if isinstance(p, dict) else p for p in knowledge_points]
    
    # 构建系统提示词
    system_prompt = """你是一位专业的知识图谱专家，擅长分析学术概念间的关系。请分析提供的知识点列表，确定它们之间的连接关系。

对于每个连接，请提供:
1. 源知识点和目标知识点
2. 关系类型（如"包含"、"依赖"、"应用"、"对比"等）
3. 关系强度（1-10，10为最强）
4. 简短说明（为什么这两个概念有关联）

只返回JSON格式的结果，不要有其他文字。格式如下:
{
  "connections": [
    {
      "source": "知识点A",
      "target": "知识点B",
      "relationship": "包含",
      "strength": 8,
      "description": "知识点A是知识点B的基础理论"
    },
    ...
  ]
}"""

    # 构建用户提示词
    user_prompt = f"请分析以下知识点之间的关系，生成知识图谱连接:\n\n学科领域: {subject_area or '未指定'}\n\n知识点列表:\n"
    for i, point in enumerate(point_names):
        user_prompt += f"{i+1}. {point}\n"
    
    # 调用AI服务
    try:
        from ..services.ai_service import ai_service
        ai_response = ai_service._call_api([
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ], temperature=0.4)
        
        # 解析JSON响应
        try:
            return json.loads(ai_response)
        except json.JSONDecodeError:
            logger.warning(f"无法解析AI响应的JSON: {ai_response[:100]}...")
            # 生成简单的线性连接作为备选
            connections = []
            for i in range(len(point_names) - 1):
                connections.append({
                    "source": point_names[i],
                    "target": point_names[i+1],
                    "relationship": "相关",
                    "strength": 5,
                    "description": "基于列表顺序的默认连接"
                })
            return {"connections": connections}
            
    except Exception as e:
        logger.error(f"生成概念连接失败: {str(e)}")
        return {"connections": []} 